package main

import "fmt"

type Describer interface {
	Describe()
}

type Person struct {
	name string
	age  int
}

func (p Person) Describe() {
	fmt.Printf("%s is %d years old\n", p.name, p.age)
}

type Address struct {
	state   string
	country string
}

func (a *Address) Describe() {
	fmt.Printf("State %s Country %s", a.state, a.country)
}

func main() {
	//使用值接受者声明的方法，既可以用值来调用，也能用指针调用
	var d1 Describer
	p1 := Person{"sam", 25}
	d1 = p1
	d1.Describe()
	p2 := Person{"James", 32}
	d1 = &p2
	d1.Describe()
	//对于使用指针接受者的方法，用一个指针或者一个可取得地址的值来调用都是合法的。
	//但接口中存储的具体值（Concrete Value）并不能取到地址，于是程序报错。
	var d2 Describer
	a := Address{"Washington", "USA"}
	d2 = &a
	d2.Describe()
}
